<!DOCTYPE html>
<html lang="it">
	<head>
		<meta charset="utf-8">
		<base href="../../../" />
		<script src="page.js"></script>
		<link type="text/css" rel="stylesheet" href="page.css" />
	</head>
	<body>
		<h1>Trasformazioni di matrici ([name])</h1>

		<p>
      Three.js utilizza le `matrici` per codificare le trasformazioni 3D, traslazioni (posizione), rotazioni e ridimensionamento. Ogni istanza di [page:Object3D]
      ha una [page:Object3D.matrix matrice] che memorizza la posizione, la rotazione e il ridimensionamento. Questa pagina descrive come aggiornare la trasformazione 
      di un oggetto.
		</p>

		<h2>Proprietà di convenienza e `matrixAutoUpdate`</h2>

		<p>
      Ci sono due modi per aggiornare la trasformazione di un oggetto:
		</p>
		<ol>
			<li>
        Modificare le proprietà `position`, `quaternion` e `scale` dell'oggetto e lasciare che three.js ricalcoli la 
        matrice dell'oggetto da queste proprietà:
				<code>
object.position.copy( start_position );
object.quaternion.copy( quaternion );
				</code>
        Per impostazione predefinita, la proprietà `matrixAutoUpdate` è impostata su true e la matrice viene ricalcolata automaticamente.
        Se l'oggetto è statico, o desideri controllare manualmente quando avviene il ricalcolo, è possibile ottenere prestazioni migliori se la 
        proprietà è impostata a false.
				<code>
object.matrixAutoUpdate = false;
				</code>
        E dopo aver modificato le proprietà, aggiornare manualmente la matrice:
				<code>
object.updateMatrix();
				</code>
			</li>
			<li>
        Modificare direttamente la matrice dell'oggetto. La classe [page:Matrix4] possiede vari metodi per modificare la matrice:
				<code>
object.matrix.setRotationFromQuaternion( quaternion );
object.matrix.setPosition( start_position );
object.matrixAutoUpdate = false;
				</code>
				Nota che, in questo caso, `matrixAutoUpdate` <em>deve</em> essere impostata a `false`, e devi essere sicuro di <em>non</em> chiamare `updateMatrix`.
        La chiamata di `updateMatrix` eliminerà le modifiche manuali apportate alla matrice, ricalcolando la matrice da `position`, `scale`, e così via.
			</li>
		</ol>

		<h2>Oggetto e matrici del mondo (world matrices)</h2>
		<p>
      La [page:Object3D.matrix matrice] dell'oggetto memorizza la trsformazione dell'oggetto <em>relativa</em> al [page:Object3D.parent genitore] dell'oggetto:
      per ottenere la trasformazione dell'oggetto nelle coordinate del <em>mondo</em>, è necessario accedere alla [page:Object3D.matrixWorld] dell'oggetto.
		</p>
		<p>
      Quando la trasformazione dell'oggetto padre o dell'oggetto figlio cambia, puoi richiedere che la [page:Object3D.matrixWorld matrixWorld] dell'oggetto
      figlio venga aggiornata chiamando il metodo [page:Object3D.updateMatrixWorld updateMatrixWorld]().
		</p>

		<h2>Rotazione e Quaternione</h2>
		<p>
      Three.js fornisce due modi per rappresentare le rotazioni 3D: [page:Euler angoli di Eulero] e [page:Quaternion Quaternioni],
      nonché metodi per la conversione tra i due. Gli angoli di Eulero sono soggetti ad un problema chiamato "gimbal lock", in cui alcune 
      configurazioni possono perdere un grado di libertà (impedendo all'oggetto di essere ruotato su un asse). Per questo motivo, le 
      rotazioni degli oggetti sono <em>sempre</em> memorizzate nei [page:Object3D.quaternion quaternioni] dell'oggetto.
		</p>
		<p>
      Le versioni precedenti della libreria includevano una proprietà `useQuaternion` che, se impostata a false, faceva si che la 
      [page:Object3D.matrix matrix] dell'oggetto fosse calcolata da un angolo di Eulero. Questa pratica è deprecata, si deve invece
      usare il metodo [page:Object3D.setRotationFromEuler setRotationFromEuler], il quale aggiornerà il quaternione.
		</p>

	</body>
</html>
